#/*************************************************************************
#    > File Name: List_Operation.py
#    > Author: Yan Wang
#    > Mail: wangyan@imnu.edu.cn
#    > Created Time: Fri 03 Jun 2022 04:50:48 PM CST
# ************************************************************************/
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Library import *

# 对于一个映射turple，查找所有的key的名称
def Get_Maplist_Key(maplist={}):
    return [key for key in maplist]


# 判断列表中某元素是否存在
def Judge_Element_Exist(input_list,element):
	if element in input_list:
		return(True)
	else:
		return(False)


#从 Dataframe中提取 dict 
def Get_Dict_from_Dataframe(df, dict_name=[]):
    list1 = {}
    df_num = len(df)
    title = df.columns.values.tolist()   #df.columns.values：返回结果是数组，（.values.tolist()：DataFrame和list之间相互转换）再进行数组与list之间的转换
    for name in dict_name:
        if name in df.columns:
            list1[name] = df[name]
            # 将变量写为科学表达式
            list1[name] = map(Switch_Scitific_Counting, list1[name])
    return list1


# 将一个列表分为n个列表
def Split_List_n_List(origin_list, n):
    if len(origin_list) % n == 0:
        cnt = len(origin_list) // n
    else:
        cnt = len(origin_list) // n + 1
    new_list = []
    for i in range(0, n):
        new_list.append(origin_list[i * cnt:(i + 1) * cnt])
    else:
        return new_list


# 打开文件， 返回一个只包含 used_map 的Dataframe
def Load_THDM_Param(df_name,used_map=None):
	df = pd.read_table(df_name)
	if used_map is None:
		return(df)
	else:
		used_df=df[used_map]
		return(used_df)



# 从df中提取需要的列used_map，并将其按照node_num分为几组，将每组数据合成为一个list形状的字符串，以便于后面的字符串替换，最后按照used_map做成一个dict
def Make_DictList_from_DF(df, node_num, used_map, df_num=0):
	if df_num != 0:
		df=df[:df_num]

	input_dict_list={}
	for key in used_map: 
		output_string=np.arange(node_num)
		if key in df:
			data_list=df[key].to_list()   #key转化为list的字符串
			split_list = Split_List_n_List(data_list, node_num)   #data_list分为node_num组列表
			output_string=[", ".join(map(str,alist)) for alist in split_list]   #split_list中的alist每一元素后面加“,”eg：a,l,i,s,t
			output_string=["["+content+"]" for content in output_string]   
		input_dict_list[key]=output_string
	return(input_dict_list)



#将字典中字符串中可替换项替换为同一个值

def Trans_Value_to_Dict(dict_name,value):
	for key in dict_name:
		dict_name[key]=dict_name[key].format(value)
	return(dict_name)

# 与Trans_Value_to_Dict类似
# 但使用template做string替换， 将string中同一个标识替换为同一个值
# 要注意和format方法替换的标识符不同，这里使用 $
def Trans_MultiValue_to_Dict(dict_name,values):
	dict_template=toolz.valmap(Template,dict_name)
	for key in dict_template:
		dict_template[key]=dict_template[key].safe_substitute(values)
	return(dict_template)

# 与Trans_Value_to_Dict类似
# 但将string中与原字典的相同的key进行替换
def Trans_ValueDict_to_Dict(dict_name,values):
	new_dict={}
	for key in dict_name:
		new_dict[key]=dict_name[key].format(values[key])
	return(new_dict)


# 将同类型value的dict，转换为list
def Trans_Dict_to_List(dict_name):
	new_list=[]
	for key in dict_name:
		new_list.append(dict_name[key])
	return(new_list)

# 去除一个高维列表的元素中的空列表
def Remove_Nested_List(listt):
	for index, value in enumerate(reversed(listt)):
		if isinstance(value, list) and value != []:
			Remove_Nested_List(value)
		elif isinstance(value, list) and len(value) == 0:
			listt.remove(value)
	return(listt)
